package sv.com.canales.accion;


import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.StrictMode;
import android.provider.MediaStore;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import com.example.AdministracionUsuarios.R;
import sv.com.canales.controlador.UsuarioControlador;
import sv.com.canales.modelo.Usuario;
import sv.com.canales.utilidades.ConversorImagen;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class RegistroUsuario extends Activity{

    private static final int SELECT_PICTURE = 1;
    private final String REGISTRO_USUARIO = "RegistroUsuario";

    private EditText usuario;
    private EditText contrasena;
    private EditText correo;
    private ImageView imageView;
    private UsuarioControlador usuarioControlador;
    private Usuario usuarioSeleccionado;
    private Bitmap bitmapImagen;
    private Button btnGuardar;
    private Button btnEliminar;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.registro_usuario);


        this.usuarioControlador = new UsuarioControlador(this);
        this.usuario = (EditText) findViewById(R.id.txtUsuario);
        this.contrasena = (EditText) findViewById(R.id.txtContrasena);
        this.correo = (EditText) findViewById(R.id.txtCorreo);
        this.imageView = (ImageView) findViewById(R.id.imgUsuario);
        this.btnGuardar = (Button) findViewById(R.id.btnGuardar);
        this.btnEliminar = (Button) findViewById(R.id.btnEliminar);

        asociarEventoImagen();

        ejecutarFlujoProceso();
    }

    private void ejecutarFlujoProceso(){
        Intent intent = getIntent();
        String accion = intent.getExtras().getString("usuarioExistente");
        //Usuario Existente
        if(accion.equals("S")){
            this.usuarioSeleccionado = this.usuarioControlador.buscarUsuarioPorUsuario(intent.getExtras().getString("pseudonimoUsuario"));
            this.usuario.setText(this.usuarioSeleccionado.getPseudonimo());
            this.contrasena.setText(this.usuarioSeleccionado.getContrasena());
            this.correo.setText(this.usuarioSeleccionado.getCorreo());
            this.imageView.setImageBitmap(ConversorImagen.getImage(this.usuarioSeleccionado.getImagen()));
            this.btnGuardar.setText("Guardar");
            this.btnEliminar.setVisibility(Button.VISIBLE);
        }else{
            this.btnGuardar.setText("Registrar");
            this.btnEliminar.setVisibility(Button.INVISIBLE);
        }
    }


    private void asociarEventoImagen(){
        this.imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                StrictMode.setThreadPolicy(policy);
                Toast.makeText(getApplicationContext(),"Click Imagen",Toast.LENGTH_SHORT);
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                intent.addCategory(Intent.CATEGORY_OPENABLE);
                startActivityForResult(intent, SELECT_PICTURE);
            }
        });
    }

    public void guardarRegistroUsuario(View view){
        Intent procesoActual = getIntent();

        try{
            String procesoActualizacion = procesoActual.getExtras().getString("usuarioExistente");

            Usuario u = new Usuario();
            u.setPseudonimo(this.usuario.getText().toString());
            u.setContrasena(this.contrasena.getText().toString());
            u.setCorreo(this.correo.getText().toString());

            if(bitmapImagen!=null){
                u.setImagen(ConversorImagen.getBytes(bitmapImagen));
            }else if(procesoActualizacion.equals("S")){
                u.setImagen(this.usuarioSeleccionado.getImagen());
            }else{
                Toast.makeText(this, "Debe seleccionar una imagen", Toast.LENGTH_SHORT).show();
                return;
            }

            if(procesoActualizacion.equals("N")){
                usuarioControlador.crearUsuario(u);
            }else{

                u.setIdentificador(this.usuarioSeleccionado.getIdentificador());
                this.usuarioControlador.modificarUsuario(u);
            }
            procesoActual.putExtra("codigoRespuesta",0);
            procesoActual.putExtra("descripcionRespuesta","Datos guardados Exitosamente");
        }catch(Exception e){
            e.printStackTrace();
            procesoActual.putExtra("codigoRespuesta",22);
            procesoActual.putExtra("descripcionRespuesta","Error al guardar usuario " + e.getMessage());
        }

        setResult(RESULT_OK,procesoActual);
        finish();
    }

    public void eliminarUsuario(View v){
        Intent procesoActual = getIntent();
        try{
            this.usuarioControlador.eliminarUsuario(this.usuarioSeleccionado);
            procesoActual.putExtra("codigoRespuesta",0);
            procesoActual.putExtra("descripcionRespuesta","Usuario eliminado");
        }catch(Exception e){
            procesoActual.putExtra("codigoRespuesta",33);
            procesoActual.putExtra("descripcionRespuesta","Error al eliminar usuario " + e.getMessage());
        }

        setResult(RESULT_OK,procesoActual);
        finish();

    }

    public void cancelarRegistroUsuario(View view){
        System.out.println("Cancelando Actividad " + RESULT_CANCELED);
        setResult(RESULT_CANCELED);
        finish();
    }


    /*************MENUS***************/

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.layout.menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.menuCancelar:
                cancelarRegistroUsuario(null);
                return true;
            case R.id.menuEliminar:
                eliminarUsuario(null);
                return true;
            case R.id.menuGuardar:
                guardarRegistroUsuario(null);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.d(this.REGISTRO_USUARIO,"Ingresando a tomar imagen request code " + requestCode + " resultado " + resultCode);
                InputStream stream = null;
                if (requestCode == SELECT_PICTURE && resultCode == Activity.RESULT_OK){
                    Log.d(this.REGISTRO_USUARIO, "Ingresando a formatear la imagen");
                    try {
                        // recyle unused bitmaps
                        if (bitmapImagen != null)
                            bitmapImagen.recycle();

                        stream = getContentResolver().openInputStream(data.getData());
                        bitmapImagen = BitmapFactory.decodeStream(stream);

                        imageView.setImageBitmap(bitmapImagen);
                        Log.d(this.REGISTRO_USUARIO, "Imagen formateada exitosamente");
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                    if (stream != null)
                        try {
                            stream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                    }
                }


        }


}
